package ace.cmp.spring.data.jdbc.querydsl.core.util;

import com.querydsl.core.types.Predicate;
import com.querydsl.sql.SQLQuery;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;

/**
 * .
 *
 * @author Caspar
 */
public class PageUtils {

  /**
   * 分页.
   *
   * @param sqlQuery 查询语句
   * @param pageable 分页参数
   * @param <T>      分页对象
   * @return 分页结果
   */
  public static <T> Page<T> page(SQLQuery<T> sqlQuery, Pageable pageable) {
    List<T> content = sqlQuery
        .offset(pageable.getOffset())
        .limit(pageable.getPageSize())
        .fetch();

    long total = sqlQuery.fetchCount();

    return new PageImpl<>(content, pageable, total);
  }

  /**
   * 分页.
   *
   * @param sqlQuery  查询语句
   * @param predicate 查询语句过滤条件
   * @param pageable  分页参数
   * @param <T>       分页对象
   * @return 分页结果
   */
  public static <T> Page<T> page(SQLQuery<T> sqlQuery, Predicate predicate, Pageable pageable) {
    SQLQuery<T> newSqlQuery = sqlQuery.where(predicate);
    List<T> content = newSqlQuery
        .offset(pageable.getOffset())
        .limit(pageable.getPageSize())
        .fetch();

    long total = newSqlQuery.fetchCount();

    return new PageImpl<>(content, pageable, total);
  }
}
